﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Logica.Clases;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Datos.SqlServer
{
    public class SqlServerCliente
    {
        #region Agregar Cliente
        /// <summary>
        /// Regista el Cliente nuevo en la Base de datos 
        /// </summary>
        /// <param name="cliente">Recibe un objeto del tipo cliente</param>
        /// <returns>Mensaje de confirmacion sobre la transaccion</returns>
        public String AgregarCliente(Cliente cliente)
        {
            //se instancia una conexion a la BD
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            String confirmacion;
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[insertarCliente]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@DirCli", cliente.Direccion);
                command.Parameters.AddWithValue("@NombreCli", cliente.Nombre);
                command.Parameters.AddWithValue("@TelefonoCli", cliente.Telefono);
                command.Parameters.AddWithValue("@CorreoCli", cliente.Correo);
                command.Parameters.AddWithValue("@RifCli", cliente.Rif);
                command.Parameters.AddWithValue("@LogoCli", cliente.Logo);
                command.Parameters.AddWithValue("@EstatusCli", cliente.Estatus);
                SqlDataReader readers = command.ExecuteReader();
                readers.Close();
                //mensaje de confirmacion exitoso
                confirmacion= "Se agrego a " + cliente.Nombre + " con éxito";
            }
            catch (SqlException e)
            {
                //En caso de que se viole la restriccion UNIQUE sobre el RIF
                if (e.Message.Contains("UNIQUE KEY"))
                    throw (new ClienteExcepcion("Error: El número de RIF ya se encuentra registrado",e));
                else
                    throw (new ClienteExcepcion("Error: " + e.Message, e));
            }
            catch (Exception errorGeneral)
            {
                //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                String errror2 = errorGeneral.Message;
                throw (new ClienteExcepcion("Error: "+errror2, errorGeneral));
            }
            finally
            {
                //se cierra la conexion a la BD
                bd.CerrarConexionBd();
            }
            return confirmacion;
        }

        #endregion Agregar Cliente

        #region Consultar Cliente
        
        /// <summary>
        /// Metodo que consulta la informacion basica de todos los clientes registrados
        /// </summary>
        /// <returns>retorna una lista de clientes, con todos los clientes registrados</returns>
        public List<Cliente> ConsultarClientes()
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Cliente> miListaCliente = new List<Cliente>();

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[consultarListaClientes]";
                command.CommandTimeout = 10;
                //se ejecuta el metodo del store procedure que busca todos los clientes del sistema
                reader = command.ExecuteReader();
                //Se recorre cada row
                while (reader.Read())
                {
                    Cliente miCliente = new Cliente();
                    //Se asigna cada atributo al objeto cliente
                    miCliente.Rif = reader.GetString(0);
                    miCliente.Nombre = reader.GetString(1);
                    miCliente.IdPersona= Convert.ToInt32(reader.GetDecimal(2));
                    //se inserta el cliente en la lista de clientes
                    miListaCliente.Add(miCliente);
                }

                return miListaCliente;
            }
            catch (SqlException error)
            {
                //En caso de que se viole alguna restriccion sobre la BD
                throw (new ClienteExcepcion(("Error: "+ error.Message), error));
            }
            catch (Exception errorGeneral)
            {
                //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                throw (new ClienteExcepcion(("Error: " + errorGeneral.Message), errorGeneral));
            }
            
            finally
            {
                // cierre de la conexion
                miConexion.CerrarConexionBd();
            }

        }
        /// <summary>
        /// metodo que busca toda la informacion registrada en el sistema para un determinado cliente
        /// </summary>
        /// <param name="miRif">se busca por el numero de rif, este es unico</param>
        /// <returns>retorna el perfil completo del cliente</returns>
        public Cliente ConsultarDetallesCliente(String miRif)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            Cliente miCliente = null;
            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[consultarDetallesCliente]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@RifCli", miRif);

                //se ejecuta el metodo del store procedure que busca todos los clientes del sistema
                reader = command.ExecuteReader();

                //Se asigna cada atributo al objeto cliente
                if (reader.Read())
                {
                    miCliente = new Cliente(reader.GetString(5), reader.GetString(0), reader.GetString(1),
                                            reader.GetString(2), reader.GetString(3), reader.GetString(6),
                                            reader.GetString(4));
                }
              
            }
            catch (SqlException error)
            {
                //En caso de que se viole alguna restriccion sobre la BD
                throw (new ClienteExcepcion(("Error: " + error.Message),error));
            }
            catch (Exception errorGeneral)
            {
                //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                throw (new ClienteExcepcion(("Error: " + errorGeneral.Message),errorGeneral));
            }
            
            finally
            {
                // se cierra la conexion
                miConexion.CerrarConexionBd();
            }

            return miCliente;
        }

        #endregion Consultar Cliente

        #region Modificar Cliente
        /// <summary>
        /// Modificar cliente, registra todos los cambios hechos en la informacion del cliente
        /// </summary>
        /// <param name="cliente">Se recibe el objeto cliente con los datos nuevos</param>
        /// <returns>Se retorna un mensaje de confirmacion sobre la transaccion </returns>
        public String modificarCliente(Cliente cliente)
        {
            //se instancia una conexion a la BD
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            String confirmacion = null;
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[actualizarCliente]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@DirCli", cliente.Direccion);
                command.Parameters.AddWithValue("@NombreCli", cliente.Nombre);
                command.Parameters.AddWithValue("@TelefonoCli", cliente.Telefono);
                command.Parameters.AddWithValue("@CorreoCli", cliente.Correo);
                command.Parameters.AddWithValue("@RifCli", cliente.Rif);
                command.Parameters.AddWithValue("@LogoCli", cliente.Logo);
                command.Parameters.AddWithValue("@EstatusCli", cliente.Estatus);
                SqlDataReader readers = command.ExecuteReader();
                readers.Close();
                //mensaje de confirmacion exitoso
                confirmacion = "Los datos de " + cliente.Nombre + " fueron actualizados con éxito";
            }
            catch (SqlException error)
            {
                //En caso de que se viole cualquier restriccion en la BD
                throw new ClienteExcepcion(("Error: Operación fallida"), error);                
            }
            catch (Exception errorGeneral)
            {
                //uso interno del grupo 7, para capturar cualquier excepcion y posterior estudio para solventar el problema
                throw new ClienteExcepcion(("Error: Operación fallida"), errorGeneral);
            }
            finally
            {
                //se cierra la conexion a la BD
                bd.CerrarConexionBd();
            }

            return confirmacion;
        }
        #endregion Modificar Cliente
    }
}